package tec;

class TestAutobus {
    void testFaussaire() {
	FauxPassager f = new FauxPassager();
	f.status = FauxPassager.DEBOUT;
	
	assert 0 == f.messages.size();

	f.nouvelArret(null, -999);
	
	assert "nouvelArret" == f.messages.getLast();
    }
    

    void testNouvelAutobus(){

	/*******************************************/
	/* AUTOBUS QU'AVEC DES PLACES ASSISES*/
	/*******************************************/
	try{
	    Bus busQueAssis = new Autobus(10,0);

	    assert true == busQueAssis.aPlaceAssise() : "a des places assises";
	    assert false == busQueAssis.aPlaceDebout() : "n'a pas de places debout";
	}catch(IllegalArgumentException e){
	}
	/*******************************************/
	/* AUTOBUS QU'AVEC DES PLACES DEBOUTS*/
	/*******************************************/
	try{
	    Autobus busQueDebout = new Autobus(0,10);
	    
	    assert false == busQueDebout.aPlaceAssise() : "n'a pas de places assises";
	    assert true == busQueDebout.aPlaceDebout() : "a des places debout";
	}catch(IllegalArgumentException e){
	}
    }

    void testDemanderPlace() {

	/*
	 * Remplir toutes les places assises d'un autobus.
	 * Remplir toutes les places debout d'un autobus.
	 */
	
	FauxPassager[] faux = {null,
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager()}; //9

	Autobus bus = new Autobus(5, 3);
	
	/*******************************************/
	/* REPLISSAGE DES PLACES ASSISES*/
	/*******************************************/
	for (int i = 1; i <= 5; i++) {

	    bus.demanderPlaceAssise(faux[i]);
	    
	    // test etat.
	    if (i == 5)
		assert false == bus.aPlaceAssise() : "fin assis";
	    else
		assert true == bus.aPlaceAssise() : "demande " + i;	
	}
	
	// test interaction.
	for (int i = 1; i <= 5; i++) {
	    assert 1 == faux[i].messages.size() : "faux " + i;
	    assert "accepterPlaceAssise" == faux[i].messages.getLast() 
		: "message " + i;
	}
	
	/*******************************************/
	/* REPLISSAGE DES PLACES DEBOUTS*/
	/*******************************************/
	for (int i = 6; i <= 8; i++) {
	    
	    bus.demanderPlaceDebout(faux[i]);
	    
	    // test etat.
	    if (i == 8)
		assert false == bus.aPlaceDebout() : "fin debout";
	    else
		assert true == bus.aPlaceDebout() : "demande " + i;	
	}
	
	// test interaction.
	for (int i = 6; i <= 8; i++) {
	    assert "accepterPlaceDebout" == faux[i].messages.getLast() 
		: "message " + i;
	}
    }


    void testDemanderSortie(){
	/*Remplissage de toutes les places debout et de toutes les places assises*/
	FauxPassager[] faux = {null,
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager()}; //12

	Bus bus = new Autobus(8, 4);
       
	/*******************************************/
	/* REMPLISSAGE DES PLACES ASSISES*/
	/*******************************************/
	for (int i = 1; i <= 8; i++) {
	    faux[i].status = FauxPassager.ASSIS;
	}
		
	/*******************************************/
	/* REMPLISSAGE DES PLACES DEBOUTS*/
	/*******************************************/
	for (int i = 9; i <= 12; i++) {
	    faux[i].status = FauxPassager.DEBOUT;
	}

	/*******************************************/
	/* SORTIE UN DEBOUT ET UN ASSIS*/
	/*******************************************/
	
	bus.demanderSortie(faux[4]); //Sortie Passager Assis
	bus.demanderSortie(faux[10]); //Sortie Passager Debout
	
	// test etat.
	/*	assert false == bus.aPlaceAssise() : "Place assise disponible";
	assert true == bus.aPlaceDebout() : "Place debout disponible";	
	*/

	// test interaction.
	assert "accepterSortie" == faux[4].messages.getLast() 
		: "Passager 4 est sorti ";
	
	assert "accepterSortie" == faux[10].messages.getLast() 
		: "Passager 10 est sorti";
	

    }
    
    void testAllerArretSuivant() {

	FauxPassager[] faux = {null,
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager()}; //12

	Autobus bus = new Autobus(8, 4);
	
	/*******************************************/
	/* REMPLISSAGE DES 3 PREMIERES PLACES EN ASSISES*/
	/*******************************************/
	for (int i = 1; i <= 3; i++) {
	    faux[i].status = FauxPassager.ASSIS;
	    bus.demanderPlaceAssise(faux[i]);
	}
		
	/*******************************************/
	/* REMPLISSAGE DES 3 DERNIERES PLACES EN DEBOUTS*/
	/*******************************************/
	for (int i = 10; i <= 12; i++) {
	    faux[i].status = FauxPassager.DEBOUT;
	    bus.demanderPlaceDebout(faux[i]);
	}
	
	// LE TABLEAU DE PASSAGERS EST VIDE !!! DONC AUTOBUS N'APPELLE PAS NOUVELARRET
	
	try{
	bus.allerArretSuivant();
	}catch(TecInvalidException e){
	}
	
	// test interaction.
	for (int i = 10; i <= 12; i++) {
	    assert "nouvelArret" == faux[i].messages.getLast() 
		: "nouvelArret pour passage " + i;
	}
	
	//DESCENTE D'UN PASSAGER DEBOUT ET UN ASSIS
	faux[2].status = FauxPassager.DEHORS;
	faux[11].status = FauxPassager.DEHORS;
	
	try{
	bus.allerArretSuivant();
	}catch(TecInvalidException e){
	}

	assert "nouvelArret" == faux[1].messages.getLast() 
	    : "nouvelArret passager 1";
	assert "nouvelArret" == faux[12].messages.getLast() 
	    : "nouvelArret passager 12";

    }


void testDemanderChanger() {

	/*
	 * Remplir toutes les places assises d'un autobus.
	 * et laisser une place debout.
	 */
	
	FauxPassager[] faux = {null,
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager(),
				   new FauxPassager()}; //9

	Autobus bus = new Autobus(5, 3);
	
	/*******************************************/
	/* REPLISSAGE DES PLACES ASSISES*/
	/*******************************************/
	for (int i = 1; i <= 5; i++) {
	    faux[i].status = FauxPassager.ASSIS;
	    bus.demanderPlaceAssise(faux[i]);
	}
	
	/*******************************************/
	/* REMPLISSAGE DES PLACES DEBOUTS*/
	/*******************************************/

	for (int i = 6; i <= 7; i++) {
	    faux[i].status = FauxPassager.DEBOUT;
	    bus.demanderPlaceDebout(faux[i]);
	}
	

	/*******************************************/
	/* ECHANGE ASSIS EN DEBOUT*/
	/*******************************************/


	//Le passager assis 2 demande une place debout
	bus.demanderChangerEnDebout(faux[2]);
	    
	// test etat.
	assert false == bus.aPlaceDebout() : "Plus de placedebout disponible";

	// test interaction.
	assert "accepterPlaceDebout" == faux[2].messages.getLast() 
		: "Passager 2 debout ";


	/*******************************************/
	/* ECHANGE DEBOUT EN ASSIS*/
	/*******************************************/
	
    	//Le passager debout 6 demande une place assise
	bus.demanderChangerEnAssis(faux[6]);
	
	// test etat.
	assert true == bus.aPlaceDebout() : "1 place debout disponible";

	// test interaction.
	assert "accepterPlaceAssise" == faux[6].messages.getLast() 
	    : "Passager 6 assis ";
	
    }


    void testExceptionLeve(){
	Autobus bus = new Autobus(8, 4);
	PassagerAbstrait faux = new PassagerAbstrait("passager1", 3, CaracterePassager.POLI){
		void choixPlaceMontee(Bus b){}
	    };

	bus.demanderPlaceAssise(faux);
	faux.accepterSortie();

	try{
	    bus.allerArretSuivant();
	    assert false : "Exception non levée !";
	}catch(TecInvalidException e){
	}
		
    }


    void lancer() { 
	int nbTest = 0;
	
	//System.out.print('.'); nbTest++;
	//testFaussaire();


	System.out.print('.'); nbTest++;
	testNouvelAutobus();
	
	System.out.print('.'); nbTest++;
	testDemanderPlace();


	System.out.print('.'); nbTest++;
	testDemanderSortie();

	System.out.print('.'); nbTest++;
	testAllerArretSuivant();


	System.out.print('.'); nbTest++;
	testDemanderChanger();

	System.out.print('.'); nbTest++;
	testExceptionLeve();

	System.out.println("(" + nbTest + "):OK: " + getClass().getName()); 
    }
}
